import { useUserStore } from '@/stores'

// 从环境变量读取 API 基础地址（见根目录 .env.example）
const baseURL = (import.meta.env && import.meta.env.VITE_API_BASE) || ''

// 避免重复跳转登录页
let isRefreshing = false

const request = (config) => {
  return new Promise((resolve, reject) => {
    const userStore = useUserStore()

    // 准备 headers
    const headers = {
      'Content-Type': 'application/json',
      Accept: 'application/json',
    }

    // 添加认证 token
    let token = userStore?.token
    if (token && typeof token === 'object' && 'value' in token)
      token = token.value
    if (!token) {
      try {
        const raw = uni.getStorageSync('user-store')
        const data = typeof raw === 'string' ? JSON.parse(raw) : raw
        if (data && data.token) token = data.token
      } catch (e) {
        console.warn('读取本地 token 失败:', e)
      }
    }
    if (token) {
      headers['authentication'] = `${token}`
    }

    // 合并用户传入的 headers
    if (config.headers) {
      Object.assign(headers, config.headers)
    }

    // 处理 GET 请求的参数
    let url = `${baseURL}${config.url}`
    let data = config.data

    if (config.method === 'GET' && config.data) {
      const queryParams = []
      Object.keys(config.data).forEach((key) => {
        if (config.data[key] !== undefined && config.data[key] !== null) {
          queryParams.push(
            `${encodeURIComponent(key)}=${encodeURIComponent(config.data[key])}`
          )
        }
      })
      const queryString = queryParams.join('&')
      if (queryString) {
        url += (url.includes('?') ? '&' : '?') + queryString
      }
      data = undefined
    }

    const requestConfig = {
      url: url,
      method: config.method || 'GET',
      data: data,
      header: headers,
      timeout: config.timeout || 10000,
      success: (res) => {
        // 仅在开发环境打印成功日志，防止线上泄露信息
        if (import.meta.env && import.meta.env.DEV) {
          console.log('Request success:', res)
        }

        // 401状态码在success中处理
        if (res.statusCode === 401) {
          // 防止重复处理
          if (isRefreshing) return
          isRefreshing = true

          try {
            // 清除登录状态
            const userStore = useUserStore()
            userStore.logout()

            uni.switchTab({
              url: '/pages/Profile/index',
              complete: () => {
                isRefreshing = false
                uni.showToast({
                  title: '身份已过期，请重新登录',
                  icon: 'none',
                  duration: 3000,
                })
              },
            })
          } catch (e) {
            isRefreshing = false
            console.error('401处理失败:', e)
          }
          // 拒绝当前请求
          reject({ statusCode: 401, errMsg: '未授权或登录已过期' })
          return
        }

        // 正常响应处理
        resolve(res.data)
      },
      fail: (err) => {
        // 仅在开发环境打印详细错误，线上提示友好信息
        if (import.meta.env && import.meta.env.DEV) {
          console.error('Request failed:', err)
        }
        isRefreshing = false // 网络错误时重置状态
        const message = err.errMsg || '网络错误'
        uni.showToast({ title: message, icon: 'none' })
        reject(err)
      },
    }
    // 仅在开发环境打印请求配置，避免暴露敏感信息
    if (import.meta.env && import.meta.env.DEV) {
      console.log('Request config:', requestConfig)
    }
    uni.request(requestConfig)
  })
}

// 创建类似 axios 的接口
const instance = {
  get: (url, config = {}) => request({ ...config, url, method: 'GET' }),
  post: (url, data, config = {}) =>
    request({ ...config, url, data, method: 'POST' }),
  put: (url, data, config = {}) =>
    request({ ...config, url, data, method: 'PUT' }),
  delete: (url, config = {}) => request({ ...config, url, method: 'DELETE' }),
  patch: (url, data, config = {}) =>
    request({ ...config, url, data, method: 'PATCH' }),
}

export default request
export { baseURL, instance }
